/*=============================================================================
* File Name : FrameControler.cpp                  Ver : 1.00  Date : 2011-08-09
*
* Description :
*
*       フレームの制御クラス.
*
* Author : yuuki tsuchida.
*============================================================================*/
#include "FrameControler.h"

#include "../utility/Log.h"


/*===========================================================================*/
/**
 * コンストラクタ．
 *
 * @param fps FPS
 */
FrameControler::FrameControler( int fps ) :
	IDEAL_WAIT_TIME( 1000 / fps )
{
	//　時間取得
	m_prevTime =  getMillTimeSecont();
	Log::LOGI( "m_prevTime = %d", m_prevTime );
	Log::LOGD( "m_prevTime = %d", m_prevTime );
}

/*===========================================================================*/
/**
 * 処理待ちを行う.
 */
void FrameControler::wait()
{
	// 現在の時間
	double	nowTime = getMillTimeSecont();


	// 1フレームの処理時間を計測
	double frameTime = nowTime - m_prevTime;

//	Log::LOGI( "nowTime = %d", nowTime );
//
//	Log::LOGI( "frameTime = %d", frameTime );
//	Log::LOGI( "CLOCKS_PER_SEC = %d", CLOCKS_PER_SEC );

	// 待ち時間を算出
	double waitTime = IDEAL_WAIT_TIME - frameTime;



	// 処理待ちを行う
	timeWait( waitTime );

	// 時間の更新をする
	m_prevTime = nowTime;

}

/*===========================================================================*/
/**
 *  一致時間の処理待ちを行う
 *
 * @param waitTime　待ち時間
 */
void FrameControler::timeWait( clock_t waitTime )
{
	// 待ち時間が０以下ならば待ちなし
	if( waitTime <= 0 )
	{
		return;
	}



	// 現在時間の取得
	double nowTime = getMillTimeSecont();
	double progressTime = 0;

	do
	{
		progressTime = getMillTimeSecont() - nowTime;
	}while( progressTime < waitTime ); // 経過時間が待ち時間よりも短いときは処理停止
}

/*===========================================================================*/
/**
 * ミリ秒．
 */
double FrameControler::getMillTimeSecont()
{
	struct timespec res;
	clock_gettime( CLOCK_MONOTONIC, &res );
	return 1000.0 * res.tv_sec + (double)res.tv_nsec/1e6;
}
